package Thread;

/*
 * Daemon守护
 * Daemon守护
 * 守护线程
 * 线程分为用户线程和守护线程
 * 正常创建的线程都是用户线程，只用调用该线程的setDaemon(true)时才会将该线程改为守护线程
 * 守护线程与用户线程最主要的区别在于进程结束:
 * 晋城的结束:
 * 当一个java进程中的所用用户线程都结束时，该进程就会结束，此时进程会强制杀死所有还在运行的守护进行
 * */
public class DaemonThreadDemo {
    public static void main(String[] args) {
        Thread rous = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i <= 5; i++) {
                    System.out.println("rose:let me go!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("adadadadada");
                System.out.println("putong");
            }
        };

        Thread jock = new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("jock:you jump!i jump!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        rous.start();
        //设置守护进程的这个工作必须在线程启动前进行，否则就会抛出异常
        jock.setDaemon(true);  //将jack线程设置为守护线程
        //守护线程 当前进程中 有两个线程rous和jock 并且jock为守护线程
        // ，rous为用户线程，当rous线程执行结束后，系统会直接结束掉当前进程，
        // 不管jock线程的执行状态是什么都会强制杀死
        jock.start();

        System.out.println("主线程结束了");
        /*
         * 守护线程 并不是守护某一个线程
         * 而线程 分类为 用户线程和守护线程
         * 如当前程序中 真正意义上已知的线程有三个
         * rous，jock，main
         * 当前jock为守护线程
         * 当rous，main这两个用户线程都执行结束后，jock就会直接被杀死
         *
         * 整个程序的结束 是当前进程中所有的线程全部执行完毕后才会结束
         * main也被称为主线程，但是同样也是一个线程
         *
         * */

        //当前进程中 有三条线程 结束的最快的就是main主线程
        //如果将main线程卡住的话 jock守护线程也不会被杀死，因为除了rous外还有主线程在存活


        //总结 ，当所有用户进程结束，杀死守护线程，进程结束
        while (true) ;

    }
}
